package top.gytf.unifiedcall.common.api;

import top.gytf.unifiedcall.model.contract.ApiContract;
import top.gytf.unifiedcall.model.detail.UnifiedCallPackageDetail;

import java.lang.reflect.Method;
import java.util.List;

/**
 * API的定义
 * <p>该对象应该是一个不可变类，可用作Map的key
 * <ul>
 *     比较包括下列字段：
 *     <li>{@link #getApiClient()}</li>
 *     <li>{@link #getApiMethod()}</li>
 * </ul>
 */
public interface ApiDefinition {
    /**
     * 获取API所属的包信息
     */
    UnifiedCallPackageDetail getPackageDetail();

    /**
     * 获取API客户端（API方法的声明类）
     */
    Class<?> getApiClient();

    /**
     * 获取处理API请求的方法
     */
    Method getApiMethod();

    /**
     * API的返回类型
     */
    Class<?> getReturnType();

    /**
     * 获取指定类型的API协定列表
     *
     * @param requiredContractClass 需要的API协定
     *
     * @return 如果不存在这种类型的协定，则返回空列表
     */
    <T extends ApiContract> List<T> getApiContracts(Class<T> requiredContractClass);
}
